package com.wlz.java8.lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author： wlz
 * @Date 2020/7/3 10:45
 * @description： TODO Java内置的四大核心函数式接口
 * @version: 1.0
 * Consumer<T>  消费型接口 消费对象  一个参数，无返回值
 *     void accept(T t);
 * Supplier<T>  供给型接口 生成对象  无参数，有返回值
 *     T get();
 * Function<R,T>  函数型接口 指定特定功能  一个参数、有返回值
 *     R apply(T t);
 * Predicate<T>  断言型接口 进行条件判断   有参数，返回值为boolean类型
 *     boolean test(T t);
 */
public class Demo4 {

    /**
     * 消费型
     */
    @Test
    public void testConsumer() {
        consume(1000,(d) -> System.out.println(d));
    }

    public void consume(Integer n,Consumer<Integer> consumer) {
        consumer.accept(n);
    }

    /**
     * 供给型接口
     */
    @Test
    public void testSupplier() {
        List<Integer> list = getNumList(10,() -> (int)(Math.random() *101));
        for (Integer i : list) {
            System.out.println(i);
        }
    }

    public List<Integer> getNumList(int n, Supplier<Integer> sup) {
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            list.add(sup.get());
        }
        return list;
    }

    /**
     * 函数型接口
     */
    @Test
    public void testFunction() {
        String strHandler = strHandler("ghsdfasd",(s) -> s.toUpperCase());
        System.out.println(strHandler);
    }

    public String strHandler(String str,Function < String,String> fun) {
        return fun.apply(str);
    }

    @Test
    public void testPredicate() {
        //返回长度大于3的字符串
        List<String> s1 = strFilter(Arrays.asList("huzhiqi", "adaad", "1231", "414441", "gagsgasg"), (s) -> s.length() > 3);
        System.out.println(s1);
        //返回包含d的字符串
        List<String> s2 = strFilter(Arrays.asList("huzhiqi", "adaad", "1231", "414441", "gagsgasg"), (s) -> s.contains("d"));
        System.out.println(s2);
    }

    public List<String> strFilter(List<String> strs,Predicate<String> predicate) {
        List<String> list = new ArrayList<> ();
        for (String str :strs) {
            if (predicate.test(str)) {
                list.add(str);
            }
        }
        return list;
    }

}
